#include <stdio.h>  // 标准输入输出
#include <unistd.h> // POSIX标准接口

#include "ohos_init.h" // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h" // CMSIS-RTOS API V2

#include "iot_gpio.h" // OpenHarmony HAL：IoT硬件设备操作接口-GPIO
#include "hi_io.h"    // 海思 Pegasus SDK：IoT硬件设备操作接口-IO

/*=================================define&&Global============================================*/
/* 红绿灯引脚定义*/
#define NIXIE1_GPIO 0  // 第二位数码管
#define NIXIE2_GPIO 10 // 第一位数码管

// 断码引脚
#define BREAK_GPIOA 1   // A
#define BREAK_GPIOB 2   // B
#define BREAK_GPIOC 5   // C
#define BREAK_GPIOD 6   // D
#define BREAK_GPIOE 7   // E
#define BREAK_GPIOF 11  // F
#define BREAK_GPIOG 13  // G
#define BREAK_GPIODP 14 // DP

unsigned int digital_tube_pins[] = {BREAK_GPIOA, BREAK_GPIOB, BREAK_GPIOC, BREAK_GPIOD,
                                    BREAK_GPIOE, BREAK_GPIOF, BREAK_GPIOG, BREAK_GPIODP}; // 引脚数组

/*=================================GPIO初始化==================================================*/
static void GpioInit(void)
{
    // GPIO初始化
    IoTGpioInit(NIXIE1_GPIO | NIXIE2_GPIO);
    IoTGpioInit(BREAK_GPIOA | BREAK_GPIOB | BREAK_GPIOC | BREAK_GPIOD | BREAK_GPIOE | BREAK_GPIOF | BREAK_GPIOG);
    // GPIO模式
    // NIXIE
    IoTGpioSetDir(NIXIE1_GPIO, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(NIXIE2_GPIO, IOT_GPIO_DIR_OUT);
    // 段码引脚
    IoTGpioSetDir(BREAK_GPIOA, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BREAK_GPIOB, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BREAK_GPIOC, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BREAK_GPIOD, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BREAK_GPIOE, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BREAK_GPIOF, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BREAK_GPIOG, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(BREAK_GPIODP, IOT_GPIO_DIR_OUT);
    // GPIO复用
    hi_io_set_func(NIXIE1_GPIO, HI_IO_FUNC_GPIO_0_GPIO);
    hi_io_set_func(NIXIE2_GPIO, HI_IO_FUNC_GPIO_10_GPIO);

    hi_io_set_func(BREAK_GPIOA, HI_IO_FUNC_GPIO_1_GPIO);
    hi_io_set_func(BREAK_GPIOB, HI_IO_FUNC_GPIO_2_GPIO);
    hi_io_set_func(BREAK_GPIOC, HI_IO_FUNC_GPIO_5_GPIO);
    hi_io_set_func(BREAK_GPIOD, HI_IO_FUNC_GPIO_6_GPIO);
    hi_io_set_func(BREAK_GPIOE, HI_IO_FUNC_GPIO_7_GPIO);
    hi_io_set_func(BREAK_GPIOF, HI_IO_FUNC_GPIO_11_GPIO);
    hi_io_set_func(BREAK_GPIOG, HI_IO_FUNC_GPIO_13_GPIO);
    hi_io_set_func(BREAK_GPIODP, HI_IO_FUNC_GPIO_14_GPIO);

    // 设置COM端默认电平
    IoTGpioSetOutputVal(NIXIE1_GPIO, 1);
    IoTGpioSetOutputVal(NIXIE2_GPIO, 1);
    for (int i = 0; i < sizeof(digital_tube_pins) / sizeof(digital_tube_pins[0]); i++)
    {
        IoTGpioSetOutputVal(digital_tube_pins[i], 1);
    }
}

/*=================================主线程函数==================================================*/
static void *DigitalTubeTask(const char *arg)
{
    (void)arg;
    // GPIO初始化函数
    GpioInit();
    // 输出提示信息
    printf("DigitalTubeTask start!\r\n");

    while (1)
    {
        for (int i = 0; i < sizeof(digital_tube_pins) / sizeof(digital_tube_pins[0]); i++)
        {
            IoTGpioSetOutputVal(digital_tube_pins[i], 0);
            // 等带500ms
            usleep(500 * 1000);
        }
        // 等带1S
        usleep(1000 * 1000);
        for (int i = 0; i < sizeof(digital_tube_pins) / sizeof(digital_tube_pins[0]); i++)
        {
            IoTGpioSetOutputVal(digital_tube_pins[i], 1);
        }
        osDelay(10);
    }
}

/*=================================入口函数==================================================*/
static void StartDigitalTubeTask(void)
{
    // 定义线程属性
    osThreadAttr_t attr;
    attr.name = "DigitalTubeTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = osPriorityNormal;

    // 创建线程
    if (osThreadNew((osThreadFunc_t)DigitalTubeTask, NULL, &attr) == NULL)
    {
        printf("Falied to create TrafficLightTask!\n");
    }
}

/*=================================运行入口函数==================================================*/
APP_FEATURE_INIT(StartDigitalTubeTask);